/*
 * @Author: 137 '1432417996@qq.com'
 * @Date: 2025-04-14 17:35:00
 * @LastEditors: 137 '1432417996@qq.com'
 * @LastEditTime: 2025-04-14 17:35:00
 * @FilePath: \starter-3\plugins\axios.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
import axios from 'axios'
import { useUserStore } from '../stores/user'

export default defineNuxtPlugin((nuxtApp) => {
  // 获取Nuxt运行时配置
  const config = useRuntimeConfig()
  console.log('插件中的API基础URL:', config.public.apiBase)

  // 创建axios实例
  const request = axios.create({
    baseURL: config.public.apiBase,
  })

  // 设置默认请求头
  request.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

  // 请求拦截器
  request.interceptors.request.use(
    (config) => {
      // 在发送请求之前做些什么，比如添加 token
      const token = useUserStore().token || localStorage.getItem('token')
      if (token) {
        // 动态添加 Authorization 头
        config.headers['Authorization'] = 'Bearer ' + token
      }
      return config
    },
    (error) => {
      // 对请求错误做些什么
      return Promise.reject(error)
    }
  )

  // 响应拦截器
  request.interceptors.response.use(
    (response) => {
      // 处理blob类型的响应
      if (response.config.responseType === 'blob') {
        if (response.status === 200) {
          return response.data
        } else {
          return Promise.reject(new Error('下载失败'))
        }
      }

      // 处理普通响应
      const res = response.data
      
      // 如果响应成功
      if (response.status === 200) {
        return res
      } else {
        console.log('response.data------------', res)
        return Promise.reject(new Error({message: res.msg || '请求失败'}))
      }
    },
    (error) => {
      // 处理错误响应
      let message = '请求失败'
      
      if (error.response) {
        // 服务器返回了错误状态码
        switch (error.response.status) {
          case 400:
            message = '请求错误'
            break
          case 401:
            message = '未授权，请重新登录'
            // 处理登录过期
            const userStore = useUserStore()
            userStore.clearUser()
            userStore.setShowLoginDialog(true)
            break
          case 403:
            message = '拒绝访问'
            break
          case 404:
            message = '请求地址出错'
            break
          case 408:
            message = '请求超时'
            break
          case 500:
            message = '服务器内部错误'
            break
          case 501:
            message = '服务未实现'
            break
          case 502:
            message = '网关错误'
            break
          case 503:
            message = '服务不可用'
            break
          case 504:
            message = '网关超时'
            break
          case 505:
            message = 'HTTP版本不受支持'
            break
          default:
            message = `连接出错(${error.response.status})`
        }
      } else if (error.request) {
        // 请求已发出，但没有收到响应
        message = '网络错误，请检查您的网络连接'
      } else {
        // 请求配置出错
        message = error.message
      }

      return Promise.reject(error)
    }
  )

  // 将axios实例提供给应用
  return {
    provide: {
      request
    }
  }
}) 